const userSchema = createZodSchema({
  type: 'object',
  shape: {
    name: {
      type: 'string',
      required: true,
      min: 2,
      requiredMessage: '请输入姓名'
    },
    age: {
      type: 'number',
      required: true,
      min: 18,
      requiredMessage: '请输入年龄'
    },
    email: {
      type: 'string',
      email: true,
      required: true,
      requiredMessage: '请输入邮箱'
    }
  }
})

// 1. 使用 parse 方法 - 验证失败会抛出异常
try {
  const validData = userSchema.parse({
    name: '张三',
    age: 20,
    email: 'zhangsan@example.com'
  })
  // validData 是经过验证的数据，可以安全使用
  console.log('验证通过:', validData)
} catch (error) {
  // 处理验证错误
  console.error('验证失败:', error.errors)
}

// 2. 使用 safeParse 方法 - 返回验证结果对象，不会抛出异常
const result = userSchema.safeParse({
  name: '张三',
  age: 16,  // 不符合最小年龄要求
  email: 'invalid-email'  // 无效的邮箱格式
})

if (result.success) {
  // 验证通过
  console.log('验证通过:', result.data)
} else {
  // 验证失败
  console.log('验证失败:', result.error.errors)
}

// 3. 异步验证场景
async function validateUser(userData: unknown) {
  // parseAsync 用于异步验证
  try {
    const validData = await userSchema.parseAsync(userData)
    return validData
  } catch (error) {
    throw error
  }
}

// 4. 部分验证 - 只验证部分字段
const partialSchema = userSchema.partial() // 所有字段变为可选
const partialResult = partialSchema.safeParse({
  name: '张三'
  // age 和 email 可以不提供
})

// 5. 与 Vue 表单验证集成
const validateForm = (formData: unknown) => {
  const result = userSchema.safeParse(formData)
  
  if (!result.success) {
    // 将 Zod 的错误信息转换为表单错误格式
    const formErrors = result.error.errors.reduce((acc, curr) => {
      const field = curr.path.join('.')
      acc[field] = curr.message
      return acc
    }, {} as Record<string, string>)
    
    return formErrors
  }
  
  return null // 验证通过
}

// 6. 类型推导
type UserType = z.infer<typeof userSchema>
// UserType 将自动包含正确的类型定义

// 7. 条件验证
const conditionalSchema = userSchema.refine(
  (data) => {
    // 自定义验证逻辑
    if (data.age < 18) {
      return data.parentConsent === true
    }
    return true
  },
  {
    message: "未成年用户需要父母同意",
    path: ["parentConsent"] // 错误信息关联到特定字段
  }
)

// 8. 预处理数据
const preprocessSchema = userSchema.transform((data) => {
  return {
    ...data,
    name: data.name.trim(),
    email: data.email.toLowerCase()
  }
})
